/**
 *\file joueur.h
 *\author Raphaël Diana
 */
#ifndef JOUEUR_H_INCLUDED
#define JOUEUR_H_INCLUDED
#include "liste.h"

/**\struct CaseJeu joueur.h*/
typedef struct sCaseJeu
{
    unsigned int indice;
    Liste* hand;
    unsigned int mise;
    float assurance;
    unsigned int doublee;
    float paiement;
}CaseJeu;

/**\struct Joueur joueur.h*/
typedef struct sJoueur
{
    float credit;
    CaseJeu* jeu;
    unsigned int nombreDeMain;
}Joueur;

/* ---------------------------------------------- GESTION STRUCTURE & MEMOIRE ----------------------------------------------*/

/** \brief Crée un Joueur.
 *
 * \param aucun
 * \return pointeur sur Joueur
 *
 */

Joueur* creerJoueur();

/** \brief Initialise le tableau de CaseJeu du Joueur.
 * Notamment les indices des CaseJeu.
 * \param pointeur sur Joueur
 * \return vide
 *
 */

void initJeuJoueur(Joueur*);

/** \brief Vide le Joueur.
 *
 * \param pointeur sur Joueur.
 * \return vide
 *
 */

void videJoueur(Joueur*);

/** \brief Libère le Joueur.
 *
 * \param double pointeur sur Joueur
 * \return vide
 *
 */

void testamentJoueur(Joueur **);

/** \brief Crée un tableau de CaseJeu.
 *
 * \param aucun
 * \return vide
 *
 */

CaseJeu* creerJeuJoueur();

/** \brief Libère le jeu du Joueur.
 *
 * \param pointeur sur Joueur
 * \return vide
 *
 */

void testamentJeuJoueur(Joueur*);

/** \brief Crée une CaseJeu.
 *
 * \param aucun
 * \return CaseJeu
 *
 */

CaseJeu creerCaseJeu();

/** \brief Vide le contenu d'une CaseJeu.
 *
 * \param pointeur sur CaseJeu
 * \return vide
 *
 */

void videCaseJeu(CaseJeu*);

/** \brief Vide le jeu du Joueur.
 *
 * \param pointeur sur Joueur
 * \return vide
 *
 */

void videJeuJoueur(Joueur*);
/* ---------------------------------------------- FIN GESTION STRUCTURE & MEMOIRE ----------------------------------------------*/


/* ---------------------------------------------- ACCESSEUR ----------------------------------------------*/
/** \brief Retourne le crédit du Joueur.
 *
 * \param pointeur sur Joueur
 * \return vide
 *
 */

int testCreditJoueur(const Joueur *);

/** \brief Retourne la mise d'une CaseJeu
 *
 * \param pointeur sur Joueur
 * \param entier
 * \return entier
 *
 */

int testMiseJoueur(const Joueur*, int);

/** \brief Retourne le champ doublee d'une CaseJeu.
 *
 * \param pointeur sur CaseJeu
 * \return entier
 *
 */

int testdoubleJoueur(const CaseJeu *);

/** \brief Retourne le champ mise d'une CaseJeu.
 *
 * \param pointeur sur CaseJeu
 * \return entier
 *
 */

int testMiseCase (const Joueur*, int);

/** \brief Retourne l'adresse d'une main du Joueur.
 *
 * \param pointeur Joueur
 * \param entier
 * \return pointeur sur Liste
 *
 */

Liste* getListeJoueur(const Joueur*, int);

/** \brief Retourne le nombre de Carte d'une main.
 * Utilise getNombreElement.
 * \param pointeur sur Joueur
 * \param entier
 * \return entier non-signé
 *
 */

unsigned int getNombreCarte(Joueur*, int);

/** \brief Retourne le champ indice d'une CaseJeu.
 *
 * \param pointeur sur Joueur
 * \param entier
 * \return entier non-signé
 *
 */

unsigned int getIndiceCase(Joueur*, int);
/* ---------------------------------------------- FIN ACCESSEUR ----------------------------------------------*/

/* ---------------------------------------------- MUTATEUR ----------------------------------------------*/
/** \brief Modifie le champ credit du Joueur.
 *
 * \param pointeur sur Joueur
 * \param entier non-signé
 * \return vide
 *
 */

void crediteJoueur(Joueur*, unsigned int);

/** \brief Modifie le champ doublee d'une CaseJeu
 *
 * \param pointeur sur CaseJeu
 * \return vide
 *
 */

void doubleJoueur(CaseJeu *);

/** \brief Modifie le champ credit du Joueur.
 *
 * \param pointeur sur Joueur
 * \param entier non-signé
 * \return vide
 *
 */

void paiementJoueur(Joueur*, unsigned int);

/** \brief Sépare une main en deux.
 *
 * \param pointeur sur Joueur
 * \param entier
 * \return vide
 *
 */

void separerListeJoueur(Joueur* , int);

/** \brief Retourne si une main est un Blackjack.
 *
 * \param pointeur sur Joueur
 * \param entier
 * \return entier
 *
 */

int testBlackjackCase(const Joueur*, int);


/** \brief Modifie le champ mise d'une CaseJeu.
 *
 * \param pointeur sur Joueur
 * \param entier non-signé
 * \param entier
 * \return vide
 *
 */

void placeMise(Joueur*, unsigned int, int);

/** \brief Double le champ mise d'une CaseJeu.
 *
 * \param pointeur sur Joueur
 * \param entier non-signé
 * \return vide
 *
 */

void doubleMise(Joueur*, unsigned int);

/** \brief Modifie le champ assurance d'une CaseJeu.
 *
 * \param pointeur sur Joueur
 * \param pointeur sur CaseJeu
 * \return entier non-signé
 *
 */

void prendreAssurance(Joueur*, CaseJeu*, unsigned int);

/* ---------------------------------------------- FIN MUTATEUR ----------------------------------------------*/

/* ---------------------------------------------- AFFICHAGE ----------------------------------------------*/
/**\brief Affiche la main d'un joueur */
void afficheMainJoueur(const Joueur *,unsigned int);
/* ---------------------------------------------- FIN AFFICHAGE ----------------------------------------------*/

#endif
